import { Module } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { WinstonModule, WinstonModuleOptions } from 'nest-winston';
import { createLogger, Logger, format, transports } from "winston";
import { utilities } from 'nest-winston';
import * as DailyRotateFile from "winston-daily-rotate-file";
import { LogEnum } from 'src/enum/config.enum';

function getTransports(configService: ConfigService) {
    const consoleTransports = new transports.Console({
        format: format.combine(
            format.timestamp(),
            utilities.format.nestLike()
        ),
        level: 'info',
    })
    
    // const errorDialyTransports = new DailyRotateFile({
    //     filename: `myLog/errors/error-%DATE%.log`, // 日志名称，占位符 %DATE% 取值为 datePattern 值。
    //     datePattern: 'YYYY-MM-DD', // 日志轮换的频率，此处表示每天。
    //     zippedArchive: true, // 是否通过压缩的方式归档被轮换的日志文件。
    //     maxSize: '10m', // 设置日志文件的最大大小，m 表示 mb 。
    //     maxFiles: '14d',   // 保留日志文件的最大天数，此处表示自动删除超过 14 天的日志文件。
    //     level: 'error', // 日志类型，此处表示只记录错误日志。
    //     format: format.combine(
    //         format.timestamp(),
    //         format.simple(),
    //     )
    // })
    const warnDialyTransports = new DailyRotateFile({
        filename: 'myLog/warnings/warning-%DATE%.log',
        datePattern: 'YYYY-MM-DD',
        zippedArchive: true,
        maxSize: '20m',
        maxFiles: '14d',
        level: 'warn',
        format: format.combine(
            format.timestamp(),
            format.simple(),
    )
    })
    const infoDialyTransports = new DailyRotateFile({
        filename: `myLog/info/info-%DATE%.log`,
        datePattern: 'YYYY-MM-DD',
        zippedArchive: true,
        maxSize: '10m',
        maxFiles: '14d',
        level: configService.get(LogEnum.LOG_LEVEL),
        format: format.combine(
            format.timestamp(),
            format.simple(),
        )
    })
    const additionTransports = configService.get(LogEnum.LOG_ON) ? [warnDialyTransports, infoDialyTransports] : []
    return [consoleTransports, ...additionTransports]
}

@Module({
    imports: [
        WinstonModule.forRootAsync({
            inject: [ConfigService],
            useFactory: (configService: ConfigService) => 
            ({
                transports: getTransports(configService)
            } as WinstonModuleOptions)
        })
    ],
})
export class LogsModule {}
